package com.meitianhui.convenitenbuy.util;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;

import com.meitianhui.convenitenbuy.Constants;
import com.meitianhui.convenitenbuy.widget.dialog.BottomMenuDialog;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class PictureUtil {

    /**
     * Gets real filepath from a Uri instance.
     */
    private static String getFilepathFromUri(Context context, Uri uri) {
        final String scheme = uri.getScheme();
        String filepath = "";

        if (scheme == null) {
            filepath = uri.getPath();

        } else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            filepath = uri.getPath();

        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            Cursor cursor = null;
            String[] proj = {MediaStore.Images.Media.DATA};
            try {
                cursor = context.getContentResolver().query(uri, proj, null, null, null);
                if (cursor != null) {
                    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    cursor.moveToFirst();
                    filepath = cursor.getString(columnIndex);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
        return filepath;
    }

    /**
     * Gets real filepath from string Uri.
     */
    private static String getFilepathFromUri(Context context, String strUri) {
        Uri uri = Uri.parse(strUri);
        return getFilepathFromUri(context, uri);
    }

    /**
     * 将图片路径转化成 Bitmap 对象。
     *
     * @param context context
     * @param imgUri  图片的 Uri
     * @param dp      图片长或宽最大值（图片的长或宽超过这个值，就会压缩。）
     * @return 压缩后的 Bitmap
     * @throws FileNotFoundException FileNotFoundException
     */
    public static Bitmap addFilePath(Context context, Uri imgUri, int dp)
            throws FileNotFoundException {

        BitmapFactory.Options boundsOptions = new BitmapFactory.Options();
        boundsOptions.inJustDecodeBounds = true;
        InputStream inputStream = context.getContentResolver().openInputStream(imgUri);
        BitmapFactory.decodeStream(inputStream, null, boundsOptions);
        // remember to close input stream.
        IOUtils.closeQuietly(inputStream);

        int width = boundsOptions.outWidth;
        int height = boundsOptions.outHeight;
        int wRatio = (int) Math.ceil(width / (float) dp);
        int hRatio = (int) Math.ceil(height / (float) dp);
        int scale = 1;
        if (hRatio > 1 || wRatio > 1) {
            scale = hRatio > wRatio ? hRatio : wRatio;
        }

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = scale;
        // 设置加载边界信息为false
        options.inJustDecodeBounds = false;
        // 重新读取 inputStream 中的内容。之前的 inputStream 会为null.
        inputStream = context.getContentResolver().openInputStream(imgUri);
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
        IOUtils.closeQuietly(inputStream);

        return bitmap;
    }

    /**
     * 把bitmap转换成String
     *
     * @param
     * @return
     */
    public static String bitmapToString(Bitmap bm) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();

        return Base64.encode(b);

    }

    /**
     * 质量压缩方法
     *
     * @param image
     * @return
     */
    public static Bitmap compressImage(Bitmap image) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
        int options = 100;
        while (baos.toByteArray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
            baos.reset();// 重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%，把压缩后的数据存放到baos中
            options -= 10;// 每次都减少10
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
        return bitmap;
    }

    /**
     * 图片按比例大小压缩方法（根据路径获取图片并压缩）
     *
     * @param srcPath
     * @return
     */
    public static Bitmap getimage(String srcPath) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 开始读入图片，此时把options.inJustDecodeBounds 设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空

        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        // 现在主流手机比较多是800*480分辨率，所以高和宽我们设置为
        float hh = 800f;// 这里设置高度为800f
        float ww = 480f;// 这里设置宽度为480f
        // 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
        int be = 1;// be=1表示不缩放
        if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0)
            be = 1;
        newOpts.inSampleSize = be;// 设置缩放比例
        // 重新读入图片，注意此时已经把options.inJustDecodeBounds 设回false了
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
    }

    /**
     * 图片按比例大小压缩方法（根据Bitmap图片压缩）
     *
     * @param image
     * @return
     */
    public static Bitmap comp(Bitmap image) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        if (baos.toByteArray().length / 1024 > 1024) {// 判断如果图片大于1M,进行压缩避免在生成图片（BitmapFactory.decodeStream）时溢出
            baos.reset();// 重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 这里压缩50%，把压缩后的数据存放到baos中
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 开始读入图片，此时把options.inJustDecodeBounds 设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        // 现在主流手机比较多是800*480分辨率，所以高和宽我们设置为
        float hh = 840f;// 这里设置高度为800f
        float ww = 520f;// 这里设置宽度为480f
        // 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
        int be = 1;// be=1表示不缩放
        // if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
        // be = (int) (newOpts.outWidth / ww);
        // } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
        // be = (int) (newOpts.outHeight / hh);
        // }
        // if (be <= 0)
        // be = 1;
        newOpts.inSampleSize = be;// 设置缩放比例
        // 重新读入图片，注意此时已经把options.inJustDecodeBounds 设回false了
        isBm = new ByteArrayInputStream(baos.toByteArray());
        bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
        return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
    }

    /**
     * 裁剪图片方法实现
     *
     * @param uri
     */
    public static void startPhotoZoom(Activity mContext, Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);// true:不返回uri，false：返回uri

        mContext.startActivityForResult(intent, BottomMenuDialog.REQUEST_CODE);

    }
    /**
     * 裁剪图片方法实现
     *
     * @param uri
     */
    public static void startPhotoZoomForComFriend(Activity mContext, Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("outputX", 400);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 4);
        intent.putExtra("aspectY", 2);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);// true:不返回uri，false：返回uri
        mContext.startActivityForResult(intent, BottomMenuDialog.REQUEST_CODE);

    }
    public static void startPhotoZoomSize(Activity mContext, Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.putExtra(
               Constants.INTENT_FLAG_SOURCE, true);
        intent.setDataAndType(uri, "image/*");
        // 设置裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 33);
        intent.putExtra("aspectY", 10);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("scale", true);
        intent.putExtra("noFaceDetection", false);
        intent.putExtra("return-data", true);
        mContext.startActivityForResult(intent, BottomMenuDialog.REQUEST_CODE);
    }
}
